﻿package {
	import flash.display.*;
	import flash.events.*;
    import flash.utils.Timer;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.text.TextField;
	import flash.filters.BitmapFilterQuality;
	import flash.filters.BlurFilter;

	
	
	
	import class_auto;
	import class_weg;
	import ProximityManager;

	public class verkeer extends MovieClip {
		
		
		//init vars
		
		public var weg1:class_weg= new class_weg;

		//initieel aantal autos
		var NUMAUTOS:int=60;
		var MAXPARTICLES:int=512;
		var plife:Number=9;
		//auto array
		var autos:Array = new Array();

		var GameTimer:Timer = new Timer(1000/35);
		
		//xml shit
		var xmlLoader:URLLoader = new URLLoader();
		var xmlData:XML = new XML();
		
		//editor
		//var the_editor:editor= new editor;
		 var button:Sprite = new Sprite();
         var textLabel:TextField = new TextField();
		 var editor:Sprite = new Sprite();
		 
		 var pm:ProximityManager = new ProximityManager(24);
		 var particles:Array = new Array();
		 var particleSprite:Sprite= new Sprite();
		var blur:BlurFilter = new BlurFilter();
		
		public function verkeer():void{
			
			
			drawButton();
			button.x=400;
			button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            addChild(button);
			addChild(editor);
			//load level and set up cars
			loadLevel();
			
			
			stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown);
			GameTimer.addEventListener(TimerEvent.TIMER, mainGameLoop);
			//btn_Edit.addEventListener(MouseEvent.CLICK, btn_editor_clicked);
			
			
			blur.blurX = 10;
			blur.blurY = 10;
			blur.quality = BitmapFilterQuality.MEDIUM;
			
					
					
		}
		
		
		function mainGameLoop(event:TimerEvent):void{
			var g:Graphics = this.graphics;
			for(var i:int=0;i<autos.length;i++){
				
				
				if(particles.length<MAXPARTICLES){
					particles.push([autos[i].x+autos[i].width/2,autos[i].y+autos[i].height/2,plife]);
				}
				// init vector numbers
				var a:Number;
				var b:Number;
				var len:Number;	
				
				a=autos[i].x-weg1.wegpunten[autos[i].lijnstuk+1][0];
				b=autos[i].y-weg1.wegpunten[autos[i].lijnstuk+1][1];
				len=Math.sqrt(a*a+b*b); //Lennie gaat hier door voor 'afstand tot volgende wegpunt'
				
				if(len<=4){ //5 marge voor volgende wegstuk
					weg1.wegpunten[autos[i].lijnstuk][2]--; //broadcast removal aan lijnstuk
					if(autos[i].lijnstuk<weg1.wegpunten.length-2){
					autos[i].lijnstuk++;
					}else{
						autos[i].lijnstuk=0;
					}
					weg1.wegpunten[autos[i].lijnstuk][2]++; //broadcast position to lijnstuk
				}
			
							//trace(weg1.wegpunten[0][2]);
				// bereken vector en broem
				a=weg1.wegpunten[autos[i].lijnstuk+1][0]-autos[i].x;
				b=weg1.wegpunten[autos[i].lijnstuk+1][1]-autos[i].y;
				len=Math.sqrt(a*a+b*b);			
				autos[i].xvec=a/len;
				autos[i].yvec=b/len;
				autos[i].move_auto();
				blur.blurX=autos[i].snelheid*1;
				blur.blurY=autos[i].snelheid*1;
				autos[i].filters = [blur];
			}
			//particles
			particleSprite.graphics.clear();
			for(i=0;i<particles.length;i++){
				particles[i][2]*=0.9;
				if(particles[i][2]<1){
					particles.splice(i,1);
				}
				particleSprite.graphics.beginFill(0xFFF280,particles[i][2]/plife); // grey color
             	particleSprite.graphics.drawCircle(particles[i][0],particles[i][1],2);
             	particleSprite.graphics.endFill();
				blur.blurX=blur.blurY=particles[i][2];
				particleSprite.filters = [blur];
			}
			
			
			
			//collisions checken hier:
			pm.refresh();
			
			
			/*var g:Graphics = this.graphics;
			g.clear();
			g.lineStyle(0,0xBBBBBB,1);*/
			
			
			var count:uint = 0;
			for (i=0; i<autos.length; i++) {
				//var sprite:MovieClip = autos[i] as MovieClip;
				
				var neighbors:Array = pm.getNeighbors(autos[i]);
				var l:uint = neighbors.length;
				autos[i].scaleX = autos[i].scaleY = 0.5+l*0.05*2;
				for (var j:uint=0; j<l; j++) {
					var neighbor:DisplayObject = neighbors[j] as DisplayObject;
					if (neighbor.y > autos[i].y) {
						//g.moveTo(autos[i].x,autos[i].y);
//						g.lineTo(neighbor.x,neighbor.y);
						a=autos[i].x-neighbor.x;
						b=autos[i].y-neighbor.y;
						if(Math.sqrt(a*a+b*b)<autos[i].width&&!autos[i].collision){autos[i].collision=true;}
						
						//count++;
					}
				}
				
			}
		}
		function addAutos():void{
			//INIT autos / adhv algemene NUMAUTOS:
			var NUMBOUWEN:int = NUMAUTOS - autos.length;
			trace(NUMBOUWEN,autos.length);
			for(var i:int=0;i<NUMBOUWEN;i++){
				//auto properties
				var locatie:int = Math.random()*weg1.wegpunten.length-1; //lijnstuk
				var snelheid:Number = Math.floor( Math.random() * ((4*int(aard)) - (2*int(aard)))+2+int(aard)*1.5); //snelheid
				var aard:Boolean = Boolean(Math.round(Math.random()));

				//vector numbers
				var len:Number;
				var a:Number; 
				var b:Number;
				
													//aard, leven, baan, lijnstuk, snelheid
				var t_auto:class_auto=new class_auto(Boolean(aard),true,1,locatie,snelheid);
				autos.push(t_auto);
				this.addChild(autos[i]);
				
				//add aan proximity manager
				pm.addItem(autos[i]);

				//broadcast positie naar lijnstuk
				weg1.wegpunten[autos[i].lijnstuk][2]++;
				//trace(weg1.wegpunten[1][2]);
				
				//bereking vector
				a=weg1.wegpunten[autos[i].lijnstuk+1][0]-weg1.wegpunten[autos[i].lijnstuk][0];
				b=weg1.wegpunten[autos[i].lijnstuk+1][1]-weg1.wegpunten[autos[i].lijnstuk][1];
				len=Math.sqrt(a*a+b*b); //squares zo omdat flash ^2 niet hapt
				autos[i].xvec=a/len;
				autos[i].yvec=b/len;
				
				autos[i].x=weg1.wegpunten[autos[i].lijnstuk][0];
				autos[i].y=weg1.wegpunten[autos[i].lijnstuk][1];
				//random start positie
				len=int(Math.random()*50);
				autos[i].x+=(autos[i].xvec*snelheid)*len;
				autos[i].y+=(autos[i].yvec*snelheid)*len;
				
				autos[i].os=autos[i].snelheid;
				
				autos[i].addEventListener(MouseEvent.CLICK, autos[i].onMouseClickEvent);
				autos[i].addEventListener(MouseEvent.MOUSE_OVER, autos[i].onMouseOverEvent);
				autos[i].addEventListener(MouseEvent.MOUSE_OUT, autos[i].onMouseOutEvent);
				
				
			}
			
		}
		
		function loadLevel():void{
			xmlLoader.addEventListener(Event.COMPLETE, LoadLevelXML);
			xmlLoader.load(new URLRequest("level.xml"));
													  
		}
		function LoadLevelXML(e:Event):void {
			xmlData = new XML(e.target.data);
			//trace(xmlData);
			//trace(xmlData.wegpunt[0].xx);
			//trace(xmlData.wegpunt.length());
			
			for(var i:int=0;i<xmlData.wegpunt.length();i++){
				weg1.add_weg(xmlData.wegpunt[i].xx, xmlData.wegpunt[i].yy);
			}
			
			weg1.add_weg(xmlData.wegpunt[0].xx, xmlData.wegpunt[0].yy);
			
			weg1.draw_weg();
			this.addChild(weg1);
			
			//init autos& starting conditions
			init();
			
		}
		function init():void{
			//init autos
			addAutos();
			//start game
			GameTimer.start();
			addChild(particleSprite);
		}
		
		function checkKeysDown(event:KeyboardEvent):void{
		trace("You pressed key: "+event.keyCode);			
			if (event.keyCode == 187) { //voeg auto aan queue toe met +
				NUMAUTOS++;
			}
			if (event.keyCode == 32) { //bouw autos in queue
				addAutos();
			}

		}
		//EDITOR CODE
		    function drawButton():void {
             
             button.graphics.clear();
             button.graphics.beginFill(0xffffff); // grey color
             button.graphics.drawRoundRect(0, 0, 80, 25, 10, 10); // x, y, width, height, ellipseW, ellipseH
             button.graphics.endFill();
             textLabel.text = "edit";
             textLabel.x = 10;
             textLabel.y = 5;
             textLabel.selectable = false;
             button.addChild(textLabel);
			 
         }
		     private function mouseDownHandler(event:MouseEvent):void {
			if(textLabel.text=="edit"){
				textLabel.text="play";
				GameTimer.stop();
				show_editor();
				//weg1.update();
			}else{
				textLabel.text="edit";
				GameTimer.start();
				var tar:Object=editor.getChildAt(0);
				//trace(tar.numChildren);
				trace("////////////////LEVEL DATA//////////////////////");
				trace("<weg>");
				for(var i:int=0;i<weg1.wegpunten.length-1;i++){
					trace("<wegpunt>");
					trace("<xx>" + weg1.wegpunten[i][0] + "</xx>");
					trace("<yy>" + weg1.wegpunten[i][1] + "</yy>");
					trace("</wegpunt>");
				}
				trace("</weg>");
				trace("////////////////LEVEL DATA//////////////////////");
				for(i=0;i<tar.numChildren-1;i++){
					tar.graphics.clear();
					editor.removeChildAt(i);
					
				}
			}
				
         }
		function show_editor():void{
			var wegpunten: Sprite = new Sprite();
			for(var i:int=0;i<weg1.wegpunten.length-1;i++){
				var btn_hkpnt: Sprite= new Sprite();
				
				btn_hkpnt.graphics.beginFill(0xFFCC00);
				btn_hkpnt.graphics.drawCircle(0, 0, 10);

				btn_hkpnt.x=weg1.wegpunten[i][0];
				btn_hkpnt.y=weg1.wegpunten[i][1];
				
				btn_hkpnt.addEventListener(MouseEvent.MOUSE_DOWN, sleepPunt);
				btn_hkpnt.addEventListener(MouseEvent.MOUSE_UP, zetPunt);
				
				wegpunten.addChildAt(btn_hkpnt,i);
				editor.addChildAt(wegpunten,0);
			}			
		}
		
		function sleepPunt(evt:MouseEvent):void{
			//trace(evt.target.parent.getChildAt(0).x);
			evt.target.startDrag(true);
		
		}
		function zetPunt(evt:MouseEvent):void{
			evt.target.stopDrag();
			for(var i:int=0;i<weg1.wegpunten.length-1;i++){
				weg1.wegpunten[i][0]=evt.target.parent.getChildAt(i).x;
				weg1.wegpunten[i][1]=evt.target.parent.getChildAt(i).y;
			}
			//weg1.wegpunten[weg1.wegpunten,length-1][0]= weg1.wegpunten[0][0];
			//weg1.wegpunten[weg1.wegpunten,length-1][1]= weg1.wegpunten[0][1];
			weg1._update();
		}
	}
	
}